The present invention relates to computer network virtualization, and more specifically, to providing virtual appliance system firmware images.
In a networking virtual appliance, an operating system is typically created and updated in sequential versions; each version relying on the previous version's updates. During boot up, a virtual BIOS loads a boot loader, which is used to allow the user to select from a choice of Linux kernels. Each Linux kernel typically shares the same local disk storage device and loads the same operating system stored on that local disk storage device. The boot loader decides which kernel to boot from and tells the kernel which local storage to use. The kernel initializes the virtual hardware, then loads the operating system stored on the local disk. The operating system typically takes control of the system from this point and loads the application.
Software upgrades to the virtual appliance may be managed according to a similar process on a per component basis. Upgrades and downgrades may be performed through a package management tool. Individual files on the operating system are upgraded individually based on association with each other. Upgrades to running applications on the virtual appliance may occur periodically and may be stored as sequential versions in the local disk. Each upgrade loaded into the virtual appliance includes its own libraries of files. However not all upgrade versions may be desirable by the user. For example, some versions of the operating system running on the virtual appliance may contain bugs or conflicts among the application(s) being run. Thus, it may become very easy for the resulting operating system that supports the application the appliance is running to become out of sync with the application. It may not be possible to simply skip back to a previously known functional version of the operating system without first sequentially downgrading each upgrade one by one. Attempts to jump back to a previous version of the operating system may create points of failure between upgraded components. Additionally, if certain library files are being employed, the software trying to perform the downgrade is using the same library files that need to be downgraded, hence creating an inexecutable situation.